package com.qo.qsdk.utils;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.util.Log;

import java.lang.reflect.Field;

public class DynamicUtils {

    private static final String TAG = DynamicUtils.class.getSimpleName();

    public static int id(Context paramContext, String paramString) {
        return getIdentifier(paramContext, paramString, "id");
    }

    public static int string(Context paramContext, String paramString) {
        return getIdentifier(paramContext, paramString, "string");
    }

    public static int color(Context paramContext, String paramString) {
        return getIdentifier(paramContext, paramString, "color");
    }

    public static int mipmap(Context paramContext, String paramString) {
        return getIdentifier(paramContext, paramString, "mipmap");
    }

    public static int drawable(Context paramContext, String paramString) {
        return getIdentifier(paramContext, paramString, "drawable");
    }

    public static int layout(Context paramContext, String paramString) {
        return getIdentifier(paramContext, paramString, "layout");
    }

    public static int dimen(Context paramContext, String paramString) {
        return getIdentifier(paramContext, paramString, "dimen");
    }

    public static int style(Context paramContext, String paramString) {
        return getIdentifier(paramContext, paramString, "style");
    }

    public static int raw(Context paramContext, String paramString) {
        return getIdentifier(paramContext, paramString, "raw");
    }

    public static int anim(Context paramContext, String paramString) {
        return getIdentifier(paramContext, paramString, "anim");
    }

    public static int attr(Context context, String name) {
        return getIdentifier(context, name, "attr");
    }

    // 通过反射实现
    public static final int[] getStyleableIntArray(Context sContext, String name) {
        try {
            if (sContext == null)
                return null;
            Field field = Class.forName(sContext.getPackageName() + ".R$styleable").getDeclaredField(name);
            int[] ret = (int[]) field.get(null);
            return ret;
        } catch (Throwable t) {
        }
        return null;
    }

    public static final int getStyleableIntArrayIndex(Context sContext, String name) {
        try {
            if (sContext == null)
                return 0;
            // use reflection to access the resource class
            Field field = Class.forName(sContext.getPackageName() + ".R$styleable").getDeclaredField(name);
            int ret = (Integer) field.get(null);
            return ret;
        } catch (Throwable t) {
        }
        return 0;
    }

    public static int getColor(Context context, String str) {
        Resources resources = context.getResources();
        int id = color(context, str);

        if (id != 0) {
            return resources.getColor(id);
        }

        return 0;
    }

    public static Drawable getDrawable(Context context, String str) {
        Resources resources = context.getResources();
        int id = drawable(context, str);

        if (id != 0) {
            return resources.getDrawable(id);
        }

        return null;
    }

    public static String getString(Context context, String str) {
        Resources resources = context.getResources();
        int id = string(context, str);

        if (id != 0) {
            return resources.getString(id);
        }

        return null;
    }

    private static int getIdentifier(Context context, String name, String type) {
        Resources resources = context.getResources();
        String defPackage = context.getPackageName();
        int identifier = resources.getIdentifier(name, type, defPackage);
        return getIdentifier(name, type, identifier);
    }

    private static int getIdentifier(String name, String defType, int identifier) {
        if (identifier == 0) {
            Log.e(TAG, "#* EE: resource " + name + ", type " + defType + ", undefined.");
        }
        return identifier;
    }
}
